package com.lwz.android.image;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView.ScaleType;
import android.widget.ProgressBar;

import com.loopj.android.image.SmartImage;
import com.loopj.android.image.SmartImageTask;
import com.loopj.android.image.SmartImageView;

/**
 * 智能加载图片的视图，继承自 Fragment
 * 
 * <p>该智能图片加载器是基于 loopj <http://www.loopj.com> 的 SmartImageView 扩展的</p>
 * 
 * <p>在加载时显示 progressbar 加载动画，加载完成后将 progressbar 设置为不可见，然后显示加载好的图片，若加载图片超时（失败），显示出错图片</p>
 * 
 * @author lwz
 */
public class SmartLoadImageView extends FrameLayout{
	
	private SmartImageView mSmartImage;
	private ProgressBar mLoadView;
	private int mFallbackResource;
	
	public SmartLoadImageView(Context context) {
		super(context);
		init(context);
	}
	
	public SmartLoadImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}
	
	public SmartLoadImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context);
	}
	
	/**
	 * 初始化视图
	 * <p>将SmartImageView的视图和加载 progressBar 加入到视图中</p>
	 * @param context
	 */
	private void init( Context context ){
		initSmartImageView(context);
		initLoadView(context);
	}
	
	/**
	 * 初始化智能 ImageView
	 * 
	 * @param context 上下文对象
	 */
	private void initSmartImageView( Context context ){
		mSmartImage = new SmartImageView(context);
		LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		lp.gravity = Gravity.CENTER;
		mSmartImage.setLayoutParams(lp);
		mSmartImage.setScaleType(ScaleType.FIT_CENTER);
		mSmartImage.setAdjustViewBounds(true);
		addView(mSmartImage);
	}
	
	/**
	 * 初始化 加载视图
	 * @param context 上下文对象
	 */
	private void initLoadView(Context context){
		mLoadView = new ProgressBar(context);
		LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		lp.gravity = Gravity.CENTER;
		mLoadView.setLayoutParams(lp);
		mLoadView.setIndeterminateDrawable(context.getResources().getDrawable(R.anim.loading));
		addView(mLoadView);
		setLoadViewVisibility(View.GONE);
	}
	
	public SmartImageView getSmartImageView() {
		return mSmartImage;
	}
	
	public void recyleImage() {
		mSmartImage.setImageDrawable(null);
	}
	
	/**
	 * 设置加载不成功的默认图片
	 * 
	 * @param fallbackResoure 加载不成功默认图片资源 id
	 */
	public void setFallbackResource(int fallbackResoure){
		mFallbackResource = fallbackResoure;
	}
	
	/**
	 * 设置图片的链接
	 * 
	 * @param url	图片的链接
	 */
	public void setImageUrl(String url) {
	   setImageUrl(url, new OnCompleteListener(null));
	}
	
	/**
	 * 设置图片
	 * @param res 资源 id
	 */
	public void setImageResource(int res){
		mSmartImage.setImageResource(res);
	}
	
	/**
	 * 设置图片的链接以及完成加载的监听
	 * 
	 * @param url	图片的链接
	 * @param completeListener	图片加载完成的监听
	 */
    public void setImageUrl(String url, SmartImageTask.OnCompleteListener completeListener) {
    	setLoadViewVisibility(View.VISIBLE);
    	mSmartImage.setImageUrl(url, mFallbackResource, null, new OnCompleteListener(completeListener));
    }

    /**
     * 设置联系人的 id,以得到联系人的图片
     * 
     * @param contactId	联系人 id
     */
    public void setImageContact(long contactId) {
    	setLoadViewVisibility(View.VISIBLE);
    	mSmartImage.setImageContact(contactId, mFallbackResource);
    }

    /**
     * 设置实现SmartImage接口的自定义对象
     * 
     * @param image 实现SmartImage接口的自定义对象
     */
    public void setImage(final SmartImage image) {
    	setImage(image, new OnCompleteListener(null));
    }
    
    /**
     * 设置实现SmartImage接口的自定义对象和加载完成监听
     * 
     * @param image 实现SmartImage接口的自定义对象
     * @param completeListener 加载完成监听
     */
    public void setImage(final SmartImage image, final SmartImageTask.OnCompleteListener completeListener) {
    	setLoadViewVisibility(View.VISIBLE);
    	mSmartImage.setImage(image, mFallbackResource, null, new OnCompleteListener(completeListener));
    }

    /**
     * 取消 SmartImageView 所有的加载任务
     */
    public static void cancelAllTasks() {
    	SmartImageView.cancelAllTasks();
    }
    
    /**
     * 自定义完成监听类
     * <p>因为加载完成了，故将加载 progressbar 设置为不可见</p>
     * @author Gemptc-01
     *
     */
    class OnCompleteListener extends SmartImageTask.OnCompleteListener{
    	private SmartImageTask.OnCompleteListener listener;
    	public OnCompleteListener(SmartImageTask.OnCompleteListener l){
    		listener = l;
    	}
		@Override
		public void onComplete(boolean isSuccess, Bitmap bmp) {
			setLoadViewVisibility(View.GONE);
			
			if(listener != null){
				listener.onComplete(isSuccess, bmp);
			}
		}
    }
    
    /**
     * 设置加载视图的可见性
     * 
     * @param visibility 可见性，可选值为 View.GONE 和 View.VISIBLE
     */
    private void setLoadViewVisibility(int visibility ){
    	mLoadView.setVisibility( visibility);
    }
	
}
